/*******************************************************************************
 * @author scl
 * @email shchlu188@163.com
 *          @brief 串口封装驱动
 ******************************************************************************/

#ifndef STM32F103VET6_ESP8266_BSP_SERIAL_H
#define STM32F103VET6_ESP8266_BSP_SERIAL_H

#include "bsp_include.h"
/** @brief  检查是否设置了指定的 UART 标志。*/
#define UART_GET_FLAG(__UART__, __FLAG__) (((__UART__)->SR & (__FLAG__)) == (__FLAG__))
/** @brief  使能具体的中断源标志位*/
#define UART_ENABLE_IT(__UART__, __INTERRUPT__)   ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__UART__)->CR1 |= ((__INTERRUPT__) & UART_IT_MASK)): \
                                                   (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__UART__)->CR2 |= ((__INTERRUPT__) & UART_IT_MASK)): \
                                                    ((__UART__)->CR3 |= ((__INTERRUPT__) & UART_IT_MASK)))
/** @brief  Disable 具体的中断源标志位.*/
#define UART_DISABLE_IT(__UART__, __INTERRUPT__)  ((((__INTERRUPT__) >> 28U) == UART_CR1_REG_INDEX)? ((__UART__)->CR1 &= ~((__INTERRUPT__) & UART_IT_MASK)): \
                                                           (((__INTERRUPT__) >> 28U) == UART_CR2_REG_INDEX)? ((__UART__)->CR2 &= ~((__INTERRUPT__) & UART_IT_MASK)): \
                                                           ((__UART__)->CR3 &= ~ ((__INTERRUPT__) & UART_IT_MASK)))

#define _UART_CLEAR_PEFLAG(__UART__)     \
  do{                                           \
    __IO uint32_t tmpreg = 0x00U;               \
    tmpreg = (__UART__)->SR;        \
    tmpreg = (__UART__)->DR;        \
    UNUSED(tmpreg);                             \
  } while(0U)
#define COM_SIZE 4 /*串口数量*/
typedef enum {
    com1 = 0,
    com2,
    com3,
    com4
} serial_port_type;
/********************************串口1 中断**********************************************/
#define COM1_IT_ENABLE (0) // 中断使能
#define COM1_IT_PreemptPriority (0) // 抢占优先级
#define COM1_IT_SubPriority (0) // 响应优先级
/********************************串口2 中断**********************************************/
/********************************串口3 中断**********************************************/
#define COM3_IT_ENABLE (1) // 中断使能
#define COM3_IT_PreemptPriority (0) // 抢占优先级
#define COM3_IT_SubPriority (0) // 响应优先级

/********************************串口4 中断**********************************************/
/********************************串口 通用**********************************************/
UART_HandleTypeDef *com_handle_get(serial_port_type port);

/**
 * @brief 串口1初始化
 * @param baud 波特率
 */
void com1_init(uint32_t baud);

/**
 * @brief 串口3初始化
 * @param baud 波特率
 */
void com3_init(uint32_t baud);

#endif //STM32F103VET6_ESP8266_BSP_SERIAL_H
